package main

import (
	"fmt"
)

func main() {
	//声明获取一个随机数组
	//[]int{5, 2, 4, 3, 1}
	numbers := []int{5, 2, 4, 3, 1} // utils.GetRandSlices(10, 5)
	fmt.Println(numbers)
	//获取数组长度
	length := len(numbers)

	//遍历数组
	endIndex := length - 1 //结束数据位置
	for i := 0; i < length; i++ {
		//排序结束
		if i >= endIndex {
			break
		}
		//最小元素下标
		minIndex := i
		maxIndex := i
		for j := i + 1; j < endIndex+1; j++ {
			//重复挑选 `最小/最大`的元素 ，放在起始位置
			if numbers[j] < numbers[minIndex] {
				//如果满足交换条件，设置最小位置
				minIndex = j
			}

			//优化：
			//重复挑选 `最小/最大`的元素 ，放在结束位置
			if numbers[j] > numbers[maxIndex] {
				//如果满足交换条件，设置最小位置
				maxIndex = j
			}
		}
		swap := fmt.Sprintf("%v", numbers)
		fmt.Printf("\n第 %d 次找到最小元素位置：`%d` ，值为 `%d` ；找到最大元素位置：`%d` ，值为 `%d`。,排序结果如下：\n\n", i+1, minIndex, numbers[minIndex], maxIndex, numbers[maxIndex])
		//判断是否需要交换数据
		if i != minIndex {
			numbers[i], numbers[minIndex] = numbers[minIndex], numbers[i]
		}
		if i == maxIndex {
			maxIndex = minIndex
		}
		if endIndex != maxIndex {
			numbers[endIndex], numbers[maxIndex] = numbers[maxIndex], numbers[endIndex]
		}
		endIndex-- //每操作完成一次，结束位置就需要挪动一次

		fmt.Printf("%s => %v \n", swap, numbers)
	}

	fmt.Println("\n最终结果如下：\n")
	//排序完成
	fmt.Println(numbers)

}
